mitmproxy python API

mitmproxy 是一款开源的交互式 HTTPS 代理,能够拦截、查看、修改和重放 HTTP 请求和响应。它的 Python API 可以让你通过编程方式使用 mitmproxy,实现自动化的网络请求分析、调试和测试等功能。

安装 mitmproxy:

pip install mitmproxy

拦截并修改响应

可以通过定义处理 HTTP 流量的函数来开始。例如,以下代码会将所有 HTTP 响应的文本反转:

from mitmproxy import http

def response(flow: http.HTTPFlow):
    if flow.response and flow.response.content:
        flow.response.content = flow.response.content[::-1]

自定义代理

你可以创建一个自定义的代理来进行更复杂的操作。

创建代理

首先,需要从 mitmproxy.optionsmitmproxy.proxy 导入必要的模块,并设置代理选项:

from mitmproxy.options import Options
from mitmproxy.proxy.config import ProxyConfig
from mitmproxy.proxy.server import ProxyServer
from mitmproxy.tools.dump import DumpMaster

options = Options(listen_host='0.0.0.0', listen_port=8080)
m = DumpMaster(options, with_termlog=False, with_dumper=False)
config = ProxyConfig(options)
m.server = ProxyServer(config)

添加处理函数

接着,你可以添加自定义的请求和响应处理函数。以下代码在每个请求 URL 中添加一个查询参数:

from mitmproxy import ctx

def request(flow: http.HTTPFlow):
    flow.request.query["mitmproxy"] = "rocks"

def response(flow: http.HTTPFlow):
    ctx.log.info("Response received!")

启动代理

最后,可以运行代理并添加处理函数:

m.addons.add(request)
m.addons.add(response)
m.run()

证书处理

如果需要拦截 HTTPS 请求,可能需要处理证书。可以使用 mitmproxy 的证书管理工具,例如安装 CA 证书到系统信任存储中。

使用场景

mitmproxy 的 Python API 适用于自动化测试、爬虫、安全分析等场景,它提供了强大的流量分析和修改能力。

代码启动 mitmproxy

proxy.py

import mitmproxy.options
from mitmproxy.tools.dump import DumpMaster
import asyncio


class ProxyOptions(mitmproxy.options.Options):
    listen_port = 11270
    listen_host = "localhost"


class RequestLogger:
    def request(self, flow):
        print(flow.request)


async def run_proxy():
    opts = ProxyOptions()
    master = DumpMaster(
        opts,
        with_termlog=False,
        with_dumper=False,
    )
    master.addons.add(RequestLogger())
    await master.run()
    return master


def start_proxy_loop():
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    loop.run_until_complete(run_proxy())

main.py(这是一个 PySide/PyQt 程序):

if __name__ == "__main__":
    a = Application(sys.argv)
    w = MainWindow()
    w.setGeometry(100, 100, 600, 768)
    w.show()

    proxy = QNetworkProxy()
    proxy.setType(QNetworkProxy.ProxyType.HttpProxy)
    proxy.setHostName("localhost")
    proxy.setPort(11270)
    QtNetwork.QNetworkProxy.setApplicationProxy(proxy)

    proxy_thread = threading.Thread(target=start_proxy_loop)
    proxy_thread.start()

    sys.exit(a.exec())

本文作者:Maeiee

本文链接:mitmproxy python API

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!